package model

import (
	"encoding/xml"

	"dev.ixmxm.top/rms/codes"
	"dev.ixmxm.top/rms/utils/base64"
	"dev.ixmxm.top/rms/utils/log"
)

func MapJsonToXml(mapXml MapXml) (string, codes.Code) {
	output, err := xml.MarshalIndent(info{mapXml}, "", "    ")
	if err != nil {
		return "", codes.ErrMapConvert
	}
	return xml.Header + string(output), nil
}

type MapJson struct {
	MapData     MapXml `json:"map_data"`
	MapName     string `json:"map_name"`   //地图唯一标志(厂区-楼层@地图名称)
	ProjectId   string `json:"project_id"` //厂区-楼层
	TrafficName string `json:"name"`       //交通图名称
}

func MapBase64ToStruct(mapData base64.Data) (*MapXml, codes.Code) {
	rawMetadata := &MapXml{}
	if err := xml.Unmarshal([]byte(mapData.MustDecode()), rawMetadata); err != nil {
		log.Panicf("parse xml map data error:%s", err.Error())
		return nil, codes.ErrMapConvert.WithDetails(err.Error())
	}
	return rawMetadata, nil
}

type info struct {
	//XMLName xml.Name `xml:"info"`
	MapXml
}

//用于储存XML和json的地图数据
type MapXml struct {
	//XMLName          xml.Name                 `xml:"info"`
	MapInfo      MapXml_Map           `xml:"map" json:"map_info"`              //地图信息信息
	Dots         []MapXml_Dot         `xml:"dot" json:"dots"`                  //站点信息集合 10000+
	Lines        []MapXml_Line        `xml:"line" json:"lines"`                //直线信息集合 20000+
	Arcs         []MapXml_Arc         `xml:"arc" json:"arcs"`                  //弧转信息集合 30000+
	BezierCurves []MapXml_BezierCurve `xml:"BezierCurve" json:"bezier_curves"` //三次贝塞尔曲线集合 80000+
	Areas        []MapXml_Area        `xml:"area" json:"areas"`                //区域信息集合 90000+
	Obstacles    []MapXml_Obstacle    `xml:"obstacle" json:"obstacles"`        //障碍物信息集合 100000+
	MarkAreas    []MapXml_MarkArea    `xml:"mark_areas" json:"mark_areas"`     //标注区域集合
	Links        []MapXml_Link        `xml:"link" json:"links"`                //链接线集合
}

//地图信息信息
type MapXml_Map struct {
	TrafficName string  `xml:"name" json:"name"`               //交通图名称
	MapName     string  `xml:"mapName" json:"mapName"`         //地图唯一标志(厂区-楼层@地图名称)
	ProjectId   string  `xml:"projectId" json:"projectId"`     //厂区-楼层
	ZoomFactor  float32 `xml:"zoomFactor" json:"zoomFactor"`   //缩放因子
	OffsetX     int64   `xml:"offsetX" json:"offsetX"`         //平移位置x
	OffsetY     int64   `xml:"offsetY" json:"offsetY"`         //平移位置y
	CameraZoom  float32 `xml:"camera_zoom" json:"camera_zoom"` //相机缩放因子
	CameraX     float32 `xml:"camera_x" json:"camera_x"`       //相机平移位置x
	CameraY     float32 `xml:"camera_y" json:"camera_y"`       //相机平移位置y
	SiteSizeX   int     `xml:"site_size_x" json:"site_size_x"` //点位尺寸X
	SiteSizeY   int     `xml:"site_size_y" json:"site_size_y"` //点位尺寸Y
}

//站点信息
type MapXml_Dot struct {
	Name           string           `xml:"name" json:"name"`                     //站点命名
	Id             string           `xml:"id" json:"id"`                         //站点ID
	Type           NodeType         `xml:"type" json:"type"`                     //点类型
	LocationType   TaskLocationType `xml:"location_type" json:"location_type"`   //库位类型
	DeviceCode     string           `xml:"deviceCode" json:"deviceCode"`         //设备编号
	Color          string           `xml:"color" json:"color"`                   //线的颜色
	Width          int              `xml:"width" json:"width"`                   //线段宽度
	X              int              `xml:"xCord" json:"xCord"`                   //站点实际坐标x
	Y              int              `xml:"yCord" json:"yCord"`                   //站点实际坐标y
	BanDir         int              `xml:"banDir" json:"banDir"`                 //站点禁止方向(-1=无禁止方向，0-360=有进行方向)
	BanDotID       string           `xml:"banDotID" json:"banDotID"`             //禁止点ID（";"隔开）
	Collision      string           `xml:"collision" json:"collision"`           //防撞策略
	ForkRotateFlag int              `xml:"forkRotateFlag" json:"forkRotateFlag"` //货叉旋转标志位 0=不可旋转、1=可旋转
	TransmitPoint  string           `xml:"transmitPoint" json:"transmitPoint"`   //中转点
	AllowAvoid     int              `xml:"allowAvoid" json:"allowAvoid"`         //允许避让(0=不允许、1=允许)
	Reserve1       string           `xml:"reserve1" json:"reserve1"`             //保留1
	Reserve2       string           `xml:"reserve2" json:"reserve2"`             //保留2
}

//直线信息
type MapXml_Line struct {
	Name           string        `xml:"name" json:"name"`                     //名称
	Id             string        `xml:"id" json:"id"`                         //ID
	Type           int           `xml:"type" json:"type"`                     //类型
	Color          string        `xml:"color" json:"color"`                   //颜色
	Width          int           `xml:"width" json:"width"`                   //线段宽度
	SiteIdA        string        `xml:"siteIDA" json:"siteIDA"`               //路径站点A
	SiteIdB        string        `xml:"siteIDB" json:"siteIDB"`               //路径站点B
	SiteIdAX       int64         `xml:"xACord" json:"xACord"`                 //A端X
	SiteIdAY       int64         `xml:"yACord" json:"yACord"`                 //A端Y
	SiteIdBX       int64         `xml:"xBCord" json:"xBCord"`                 //B端X
	SiteIdBY       int64         `xml:"yBCord" json:"yBCord"`                 //B端Y
	PathDir        PathDirection `xml:"pathDir" json:"pathDir"`               //路径方向（A->B(1)，B->A(2)，bothway（0），左侧移（3），右侧移（4））
	BodyDir        BodyDirection `xml:"bodyDir" json:"bodyDir"`               //车身方向（A->B(1)，B->A(2)，bothway（0））
	Speed          int           `xml:"speed" json:"speed"`                   //路径速度
	Collision      string        `xml:"collision" json:"collision"`           //防撞策略
	PathLength     float64       `xml:"pathLength" json:"pathLength"`         //路径长度
	ForkHighest    string        `xml:"forkHighest" json:"forkHighest"`       //货叉限高
	ForkLowest     string        `xml:"forkLowest" json:"forkLowest"`         //货叉限低
	NavigationType string        `xml:"navigationType" json:"navigationType"` //导航方式
	AllowBack      int           `xml:"allowBack" json:"allowBack"`           //允许后退(0=不允许、1=允许)
	Reserve1       string        `xml:"reserve1" json:"reserve1"`             //保留1
	Reserve2       string        `xml:"reserve2" json:"reserve2"`             //保留2
}

//链接线信息
type MapXml_Link struct {
	Id       string        `xml:"id" json:"id"`             //ID
	Name     string        `xml:"name" json:"name"`         //别名
	Type     int           `xml:"type" json:"type"`         //类型
	Width    int           `xml:"width" json:"width"`       //线段宽度
	SiteIdA  string        `xml:"siteIDA" json:"siteIDA"`   //路径站点A
	SiteIdB  string        `xml:"siteIDB" json:"siteIDB"`   //路径站点B
	PathDir  PathDirection `xml:"pathDir" json:"pathDir"`   //路径方向（A->B(1)，B->A(2)，bothway（0），左侧移（3），右侧移（4））
	Reserve1 string        `xml:"reserve1" json:"reserve1"` //保留1
	Reserve2 string        `xml:"reserve2" json:"reserve2"` //保留2
}

//弧转信息
type MapXml_Arc struct {
	Name        string        `xml:"name" json:"name"`               //名称
	Id          string        `xml:"id" json:"id"`                   //ID
	Type        int           `xml:"type" json:"type"`               //类型
	Color       string        `xml:"color" json:"color"`             //颜色
	Width       int           `xml:"width" json:"width"`             //线段宽度
	Left        string        `xml:"left" json:"left"`               //
	Right       string        `xml:"right" json:"right"`             //
	Top         string        `xml:"top" json:"top"`                 //
	Bottom      string        `xml:"bottom" json:"bottom"`           //
	StartAngle  string        `xml:"startAngle" json:"startAngle"`   //
	EndAngle    string        `xml:"endAngle" json:"endAngle"`       //
	CenterX     string        `xml:"centerX" json:"centerX"`         //
	CenterY     string        `xml:"centerY" json:"centerY"`         //
	StartPointX string        `xml:"startPointX" json:"startPointX"` //
	StartPointY string        `xml:"startPointY" json:"startPointY"` //
	EndPointX   string        `xml:"endPointX" json:"endPointX"`     //
	EndPointY   string        `xml:"endPointY" json:"endPointY"`     //
	Radius      string        `xml:"radius" json:"radius"`           //
	StartLineID string        `xml:"startLineID" json:"startLineID"` //
	EndLineID   string        `xml:"endLineID" json:"endLineID"`     //
	StartSiteID string        `xml:"startSiteID" json:"startSiteID"` //
	EndSiteID   string        `xml:"endSiteID" json:"endSiteID"`     //
	Speed       int           `xml:"speed" json:"speed"`             //路径速度
	PathDir     PathDirection `xml:"pathDir" json:"pathDir"`         //路径方向（A->B(1)，B->A(2)，bothway（0），左侧移（3），右侧移（4））
	BodyDir     BodyDirection `xml:"bodyDir" json:"bodyDir"`         //车身方向（A->B(1)，B->A(2)，bothway（0））
	Collision   string        `xml:"collision" json:"collision"`     //防撞策略
	ForkHighest string        `xml:"forkHighest" json:"forkHighest"` //货叉限高
	ForkLowest  string        `xml:"forkLowest" json:"forkLowest"`   //货叉限低
	PathLength  float32       `xml:"pathLength" json:"pathLength"`   //路径长度
	AllowBack   int           `xml:"allowBack" json:"allowBack"`     //允许后退(0=不允许、1=允许)
	Reserve1    string        `xml:"reserve1" json:"reserve1"`       //保留1
	Reserve2    string        `xml:"reserve2" json:"reserve2"`       //保留2
}

//三次贝塞尔曲线
type MapXml_BezierCurve struct {
	Name           string        `xml:"name" json:"name"`                     //名称
	Id             string        `xml:"id" json:"id"`                         //ID
	Type           int           `xml:"type" json:"type"`                     //类型
	Color          string        `xml:"color" json:"color"`                   //颜色
	Width          int           `xml:"width" json:"width"`                   //线段宽度
	SiteIdA        string        `xml:"siteIDA" json:"siteIDA"`               //路径站点A
	SiteIdB        string        `xml:"siteIDB" json:"siteIDB"`               //路径站点B
	SiteIdAX       int64         `xml:"siteIDACoordX" json:"siteIDACoordX"`   //A端X
	SiteIdAY       int64         `xml:"siteIDACoordY" json:"siteIDACoordY"`   //A端Y
	SiteIdBX       int64         `xml:"siteIDBCoordX" json:"siteIDBCoordX"`   //B端X
	SiteIdBY       int64         `xml:"siteIDBCoordY" json:"siteIDBCoordY"`   //B端Y
	AdjustPointAX  int64         `xml:"adjustPointAX" json:"adjustPointAX"`   //控制点A坐标X
	AdjustPointAY  int64         `xml:"adjustPointAY" json:"adjustPointAY"`   //控制点A坐标Y
	AdjustPointBX  int64         `xml:"adjustPointBX" json:"adjustPointBX"`   //控制点B坐标X
	AdjustPointBY  int64         `xml:"adjustPointBY" json:"adjustPointBY"`   //控制点B坐标Y
	Speed          int           `xml:"speed" json:"speed"`                   //路径速度
	PathDir        PathDirection `xml:"pathDir" json:"pathDir"`               //路径方向（A->B(1)，B->A(2)，bothway（0），左侧移（3），右侧移（4））
	BodyDir        BodyDirection `xml:"bodyDir" json:"bodyDir"`               //车身方向（A->B(1)，B->A(2)，bothway（0））
	Collision      string        `xml:"collision" json:"collision"`           //防撞策略
	ForkHighest    string        `xml:"forkHighest" json:"forkHighest"`       //货叉限高
	ForkLowest     string        `xml:"forkLowest" json:"forkLowest"`         //货叉限低
	PathLength     float64       `xml:"pathLength" json:"pathLength"`         //路径长度
	NavigationType string        `xml:"navigationType" json:"navigationType"` //导航方式
	AllowBack      int           `xml:"allowBack" json:"allowBack"`           //允许后退(0=不允许、1=允许)
	Reserve1       string        `xml:"reserve1" json:"reserve1"`             //保留1
	Reserve2       string        `xml:"reserve2" json:"reserve2"`             //保留2
}

//区域信息
type MapXml_Area struct {
	Name            string   `xml:"name" json:"name"`                         //名称
	Id              string   `xml:"id" json:"id"`                             //ID
	Type            int      `xml:"type" json:"type"`                         //类型
	Color           string   `xml:"color" json:"color"`                       //颜色
	BanAgvIds       []string `xml:"banAgvIds" json:"ban_agv_ids"`             //禁用AgvId集合(json字符串)
	EdgePoints      []Pose2  `xml:"edgePoints" json:"edge_points"`            //绘制区域边界点位坐标集合(json字符串)
	ContainDotIds   []string `xml:"containDotIds" json:"contain_dot_ids"`     //区域包含的点位ID集合(json字符串)
	ContainPathIds  []string `xml:"containPathIds" json:"contain_path_ids"`   //+区域包含路线ID集合(json字符串)
	FrontLookPoints []string `xml:"frontLookPoints" json:"front_look_points"` //+前瞻点集合(json字符串)
	AlowRotate      int      `xml:"alowRotate" json:"alow_rotate"`            //+允许旋转 0:不允许 1：允许
	IsApply         int      `xml:"is_apply" json:"is_apply"`                 //+是否需要申请 0:需要 1：不需要
	TideStartDotId  string   `xml:"tide_start_dotId" json:"tide_start_dotId"` //+潮汐起点,点位ID
	TideEndDotId    string   `xml:"tide_end_dotId" json:"tide_end_dotId"`     //+潮汐终点,点位ID
	RobotLimitCount uint     `xml:"robotLimitCount" json:"robotLimitCount"`   //小车限制数量
	Reserve1        string   `xml:"reserve1" json:"reserve1"`                 //保留1
	Reserve2        string   `xml:"reserve2" json:"reserve2"`                 //保留2
}

type MapXml_MarkArea struct {
	Name          string   `xml:"name" json:"name"`                     //名称
	Id            string   `xml:"id" json:"id"`                         //ID
	EnCode        string   `xml:"encode" json:"encode"`                 //编码
	Color         string   `xml:"color" json:"color"`                   //颜色
	EdgePoints    []Pose2  `xml:"edgePoints" json:"edge_points"`        //绘制区域边界点位坐标集合(json字符串)
	ContainDotIds []string `xml:"containDotIds" json:"contain_dot_ids"` //区域包含的点位ID集合(json字符串)
	Reserve1      string   `xml:"reserve1" json:"reserve1"`             //保留1
	Reserve2      string   `xml:"reserve2" json:"reserve2"`             //保留2
}

//障碍物信息
type MapXml_Obstacle struct {
	Name       string  `xml:"name" json:"name"`              //名称
	Id         string  `xml:"id" json:"id"`                  //ID
	Type       int     `xml:"type" json:"type"`              //类型
	Color      string  `xml:"color" json:"color"`            //颜色
	EdgePoints []Pose2 `xml:"edgePoints" json:"edge_points"` //绘制区域边界点位坐标集合(json字符串)
	Reserve1   string  `xml:"reserve1" json:"reserve1"`      //保留1
	Reserve2   string  `xml:"reserve2" json:"reserve2"`      //保留2
}

// type MapPoint struct {
// 	X int64 `json:"x"` //X
// 	Y int64 `json:"y"` //y
// }

//关联点线信息
type MapXml_AssociatedBlock struct {
	Name         string `xml:"name" json:"name"`                 //名称
	Id           string `xml:"id" json:"id"`                     //ID
	Type         int    `xml:"type" json:"type"`                 //类型
	Color        string `xml:"color" json:"color"`               //颜色
	AssociatedId string `xml:"associatedID" json:"associatedID"` //关联点线ID集合
	Reserve1     string `xml:"reserve1" json:"reserve1"`         //保留1
	Reserve2     string `xml:"reserve2" json:"reserve2"`         //保留2
}

type DeviceCode struct {
	DeviceCode string   `json:"device_code"` //设备设备编号（全场唯一）
	MapNames   []string `json:"map_names"`   //地图名称
}
